package top.jandmla.excel.util.unzipUtils;

import org.apache.commons.io.Charsets;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Unzip {
    public static List<File> unZipToFile(String inputFile, String destDirPath) throws Exception {
        File srcFile = FileUtils.getFile(inputFile);//获取当前压缩文件

        destDirPath = destDirPath + File.separator + "test";

        // 判断源文件是否存在
        if (!srcFile.exists()) {
            throw new Exception(srcFile.getPath() + "所指文件不存在");
        }
        ZipFile zipFile = new ZipFile(srcFile, Charsets.toCharset("GBK"));//创建压缩文件对象
        //开始解压
        Enumeration<?> entries = zipFile.entries();
        List<File> list = new ArrayList<>();

        while (entries.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) entries.nextElement();

            // 如果是文件夹，就创建个文件夹
            if (entry.isDirectory()) {
                File file = FileUtils.getFile(destDirPath + File.separator + entry.getName());
                if (!file.exists()) {
                    if (!file.mkdirs()) {
                        throw new Exception(srcFile.getAbsolutePath() + "创建失败！");
                    }
                }
                list.add(srcFile);

                // 如果是文件，就先创建一个文件，然后用io流把内容copy过去
            } else {
                File targetFile = FileUtils.getFile((destDirPath + File.separator + entry.getName()));

                // 保证这个文件的父文件夹必须要存在
                if (!targetFile.getParentFile().exists()) {
                    if (!targetFile.getParentFile().mkdirs())
                        throw new Exception(targetFile.getParentFile().getAbsolutePath() + "创建失败！");
                    list.add(targetFile.getParentFile());
                }

                if (!targetFile.exists()) {
                    if (!targetFile.createNewFile())
                        throw new Exception(targetFile.getAbsolutePath() + "创建失败！");
                }

                list.add(targetFile);

                // 将压缩文件内容写入到这个文件中
                InputStream is = zipFile.getInputStream(entry);
                byte[] buffer = IOUtils.toByteArray(is);
                FileUtils.writeByteArrayToFile(targetFile, buffer);
                IOUtils.closeQuietly(is);
            }
        }
        return list;
    }

    public static void deleteFiles(List<File> list) {
        for (int i = list.size() - 1; i > -1; i--) {
            File file = list.get(i);
            if (file != null) {
                if (file.exists()) {
                    FileUtils.deleteQuietly(file);
                }
            }
        }
    }
}